package com.zc58s.concurrent.spring;

import com.zc58s.concurrent.spring.config.AppConfig;
import com.zc58s.concurrent.spring.service.JdbcService;
import com.zc58s.concurrent.spring.service.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Programs {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService = context.getBean(UserService.class);
        System.out.println(userService);
        // userService 我们从容器拿到的其实的代理对象，（Cglib ==> 生成代理的原理是代理类）

        // userService代理类的属性orderService是null，但是跟踪到test方法时，orderService又有值？为什么？
        // Aspect生成代理的核心 ==> 创建一个新的类集成UserService。
        // 伪代码
        // UserServiceProxy extends UserService{
        //   private UserService superUserService;
        //   public void test(){
        //      // 方法执行前
        //      superUserService.test();
        //      // 方法执行后
        //   }
        // }
        userService.test();
        // Bean的创建生命周期（Bean是怎么创建出来的）
        //
        // InitializingBean
        // 事务底层核心原理解析
        JdbcService jdbcService = context.getBean(JdbcService.class);
        jdbcService.test();
        // jdbcService 此时是一个代理对象，现在分析下这个代理的逻辑
        // jdbcService
        // 事务代理逻辑伪代码：
        /*
         * JdbcServiceProxy extends JdbcService{
         *  private JdbcService superJdbcService;
         *  public void test(){
         *      // 1、方法上是否包含@Transactional注解
         *      // 2、创建一个数据库连接conn（由事务管理器（DataSourceTransactionManager）创建 datasource）
         *      // 3、将conn.autocommit = false; 表示不允许自动提交
         *      // 4、superJdbcService.test();
         *      // 5、没有异常 conn.commit(); 有异常 conn.rollback();
         *  }
         * }
         *
         */





    }
}
